home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / xip / iijppp.lzh / src / timer.c < prev    next >
C/C++ Source or Header  |  1994-09-25  |  3KB  |  150 lines

  1. /*
  2.  *        PPP Timer Processing Module
  3.  *
  4.  *        Written by Toshiharu OHNO (tony-o@iij.ad.jp)
  5.  *
  6.  *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
  7.  *
  8.  * Redistribution and use in source and binary forms are permitted
  9.  * provided that the above copyright notice and this paragraph are
  10.  * duplicated in all such forms and that any documentation,
  11.  * advertising materials, and other materials related to such
  12.  * distribution and use acknowledge that the software was developed
  13.  * by the Internet Initiative Japan, Inc.  The name of the
  14.  * IIJ may not be used to endorse or promote products derived
  15.  * from this software without specific prior written permission.
  16.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  17.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  18.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  19.  *
  20.  *  TODO:
  21.  */
  22. #include "defs.h"
  23. #include <sys/time.h>
  24. #include <signal.h>
  25. #include "timeout.h"
  26.  
  27. void
  28. StartTimer(tp)
  29. struct pppTimer *tp;
  30. {
  31.   struct pppTimer *t, *pt;
  32.   u_long ticks = 0;
  33.  
  34.   if (tp->state == TIMER_RUNNING) {
  35.     StopTimer(tp);
  36.   }
  37.   if (tp->load == 0) {
  38. #ifdef DEBUG
  39.     logprintf("timer %x has 0 load!\n", tp);
  40. #endif
  41.     return;
  42.   }
  43.   pt = NULL;
  44.   for (t = TimerList; t; t = t->next) {
  45. #ifdef DEBUG
  46.     logprintf("%x(%d):  ticks: %d, rest: %d\n", t, t->state, ticks, t->rest);
  47. #endif
  48.     if (ticks + t->rest >= tp->load)
  49.       break;
  50.     ticks += t->rest;
  51.     pt = t;
  52.   }
  53.  
  54.   tp->state = TIMER_RUNNING;
  55.   tp->rest = tp->load - ticks;
  56. #ifdef DEBUG
  57.   logprintf("Inserting %x before %x, rest = %d\n", tp, t, tp->rest);
  58. #endif
  59.   /* Insert given *tp just before *t */
  60.   tp->next = t;
  61.   if (pt) {
  62.     pt->next = tp;
  63.   } else
  64.     TimerList = tp;
  65.   if (t)
  66.     t->rest -= tp->rest;
  67. }
  68.  
  69. void
  70. StopTimer(tp)
  71. struct pppTimer *tp;
  72. {
  73.   struct pppTimer *t, *pt;
  74.  
  75.   if (tp->state != TIMER_RUNNING) {
  76.     tp->next = NULL;
  77.     return;
  78.   }
  79.  
  80. #ifdef DEBUG
  81.   logprintf("StopTimer: %x, next = %x\n", tp, tp->next);
  82. #endif
  83.   pt = NULL;
  84.   for (t = TimerList; t != tp; t = t->next)
  85.     pt = t;
  86.   if (t) {
  87.     if (pt)
  88.       pt->next = t->next;
  89.     else
  90.       TimerList = t->next;
  91.     if (t->next)
  92.       t->next->rest += tp->rest;
  93.   } else 
  94.     fprintf(stderr, "Oops, timer not found!!\n");
  95.   tp->next = NULL;
  96.   tp->state = TIMER_STOPPED;
  97. }
  98.  
  99. void
  100. TimerService()
  101. {
  102.   struct pppTimer *tp, *exp, *wt;
  103.  
  104.   if (tp = TimerList) {
  105.     tp->rest--;
  106.     if (tp->rest == 0) {
  107.       /*
  108.        * Multiple timers may expires at once. Create list of expired timers.
  109.        */
  110.       exp = NULL;
  111.       do {
  112.     tp->state = TIMER_EXPIRED;
  113.     wt = tp->next;
  114.     tp->enext = exp;
  115.     exp = tp;
  116. #ifdef DEBUG
  117.     logprintf("Add %x to exp\n", tp);
  118. #endif
  119.     tp = wt;
  120.       } while (tp && (tp->rest == 0));
  121.  
  122.       TimerList = tp;
  123. #ifdef DEBUG
  124.       logprintf("TimerService: next is %x(%d)\n",
  125.         TimerList, TimerList? TimerList->rest : 0);
  126. #endif
  127.       /*
  128.        * Process all expired timers.
  129.        */
  130.       while (exp) {
  131. #ifdef notdef
  132.     StopTimer(exp);
  133. #endif
  134.     if (exp->func)
  135.       (*exp->func)(exp->arg);
  136.     exp = exp->enext;
  137.       }
  138.     }
  139.   }
  140. }
  141.  
  142. void
  143. ShowTimers()
  144. {
  145.   struct pppTimer *pt;
  146.  
  147.   for (pt = TimerList; pt; pt = pt->next)
  148.     fprintf(stderr, "%x: load = %d, rest = %d\r\n", pt, pt->load, pt->rest);
  149. }
  150.